﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FlotasDesktop;
using System.Data.SqlClient;


namespace GestorDeFlotasDesktop.AbmRol
{
    public partial class AbmRol : Form
    {
        String conexion;
        Int32 idRolGlobal = -1;
        bool habilitadoGlobal = false;

        public AbmRol()
        {
            InitializeComponent();
            Utils utils = new Utils();
            conexion = utils.cargarProperties();
            cargarCheckList();
            inicializar();
            listadoRol();
        }

        private void inicializar() {
            buttonAgregarFuncionalidad.Enabled = false;
            buttonEliminarFuncionalidad.Enabled = false;
            buttonHabilitarRol.Enabled = false;
            buttonEliminarRol.Enabled = false;
            idRolGlobal = -1;
            habilitadoGlobal = false;
            textNombre.Text = "";
        }
        private void listadoRol()
        {
            using (SqlConnection connection = new SqlConnection(conexion))
            {
                try
                {
                    string sentSql = @"SELECT R.ID, R.NOMBRE ROL ,R.HABILITADO from TEQUILASO.ROL R GROUP BY R.NOMBRE,R.ID,R.HABILITADO";
                    SqlConnection sqlConn = new SqlConnection(conexion);
                    sqlConn.Open();
                   
                    DataTable objDataTable = new DataTable();
                    SqlDataAdapter dataAdap = new SqlDataAdapter(sentSql, sqlConn);
                    dataAdap.Fill(objDataTable);

                    dataGridRol.DataSource  = (objDataTable);
                    connection.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error en la tabla Funcionalidad");
                }
            }
        }

       private bool validateAlta(){
       
           if(campoNombre.Text.Length==0){
               return false;
           }
           else if (checkedListFuncionalidades.CheckedItems.Count == 0)
           {
               return false;
           }
           return true;
       }

       private void cargarCheckList() {
            using (SqlConnection connection = new SqlConnection(conexion))
            {
                try
                {
                    string sentSql = @"SELECT * FROM TEQUILASO.FUNCIONALIDAD";
                    SqlConnection sqlConn = new SqlConnection(conexion);
                    sqlConn.Open();
                    DataTable objDataTable = new DataTable();
                    SqlDataAdapter dataAdap = new SqlDataAdapter(sentSql, sqlConn);
                    dataAdap.Fill(objDataTable);

                    checkedListFuncionalidades.DataSource = (objDataTable);
                    checkedListFuncionalidades.DisplayMember = "Nombre";
                    checkedListFuncionalidades.ValueMember = "id";
                    connection.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error en la tabla Funcionalidad");
                }
            }
        }

        private void ALTA_Click(object sender, EventArgs e)
        {
            if (validateAlta())
            {
                using (SqlConnection connection = new SqlConnection(conexion))
                {
                    try
                    {
                        using (SqlCommand command = new SqlCommand())
                        {
                            connection.Open();
                            command.Connection = connection;
                            command.CommandType = System.Data.CommandType.StoredProcedure;

                            command.CommandText = "TEQUILASO.sp_altaRol";
                            command.Parameters.AddWithValue("@Nombre", campoNombre.Text);

                            if (Habilitado.Checked)
                            {
                                command.Parameters.AddWithValue("@Habilitado", 1);
                            }
                            else
                            {
                                command.Parameters.AddWithValue("@Habilitado", 0);
                            }

                            SqlDataReader reader = command.ExecuteReader();
                            string rolCreado = "";
                            while (reader.Read())
                            {
                                rolCreado = reader[0].ToString();
                            }

                            foreach (object itemChecked in checkedListFuncionalidades.CheckedItems)
                            {
                                DataRowView dataRow = itemChecked as DataRowView;
                                int intFun = Convert.ToInt32(dataRow["id"]);
                                string sentSql = @"INSERT INTO TEQUILASO.ROL_FUNCIONALIDAD (ID_ROL,ID_FUNCIONALIDAD)" +
                                                    "values (" + rolCreado + "," + intFun.ToString() + ");";
                                DataTable objDataTable = new DataTable();
                                SqlDataAdapter dataAdap = new SqlDataAdapter(sentSql, conexion);
                                dataAdap.Fill(objDataTable);
                            }
                            connection.Close();
                            MessageBox.Show("Alta Realizada Con exito");
                            inicializar();
                            listadoRol();
                            dataGridRol.Refresh();

                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error al generar el alta, Nombre Duplicado.");
                    }
                }
            }
            else {
                MessageBox.Show("Para generar el alta son requeridos el nombre del rol y las funcionalidades del mismo.");
            }
        }

        private void cargarComboFuncionalidadesDisponibles(Int32 idRol)
        {
            using (SqlConnection connection = new SqlConnection(conexion))
            {
                try
                {
                    string sentSql = @"SELECT F.* FROM TEQUILASO.FUNCIONALIDAD F
                                    WHERE F.ID NOT IN (SELECT ID_FUNCIONALIDAD FROM TEQUILASO.ROL_FUNCIONALIDAD RF
                                    WHERE RF.ID_ROL =" + idRol + ")";
                    SqlConnection sqlConn = new SqlConnection(conexion);
                    sqlConn.Open();
                    DataTable objDataTable = new DataTable();
                    SqlDataAdapter dataAdap = new SqlDataAdapter(sentSql, sqlConn);
                    dataAdap.Fill(objDataTable);

                    comboFuncionalidadesDisponibles.DataSource = (objDataTable);
                    comboFuncionalidadesDisponibles.DisplayMember = "Nombre";
                    comboFuncionalidadesDisponibles.ValueMember = "id";
                    connection.Close();

                    habilitarBotones();

                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error en la tabla Funcionalidad");
                }
            }
        }

        private void cargarComboFuncionalidadesEliminar(Int32 idRol)
        {
            using (SqlConnection connection = new SqlConnection(conexion))
            {
                try
                {
                    string sentSql = @"SELECT F.* FROM TEQUILASO.FUNCIONALIDAD F
                                    WHERE F.ID IN (SELECT ID_FUNCIONALIDAD FROM TEQUILASO.ROL_FUNCIONALIDAD RF
                                    WHERE RF.ID_ROL =" + idRol + ")";
                    SqlConnection sqlConn = new SqlConnection(conexion);
                    sqlConn.Open();
                    DataTable objDataTable = new DataTable();
                    SqlDataAdapter dataAdap = new SqlDataAdapter(sentSql, sqlConn);
                    dataAdap.Fill(objDataTable);

                    comboFuncionalidadesEliminar.DataSource = (objDataTable);
                    comboFuncionalidadesEliminar.DisplayMember = "Nombre";
                    comboFuncionalidadesEliminar.ValueMember = "id";
                    connection.Close();
                   
                    habilitarBotones();

                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error en la tabla Funcionalidad");
                }
            }
        }

        private void habilitarBotones()
        {
            if (comboFuncionalidadesEliminar.Items.Count == 0)
            {
                buttonEliminarFuncionalidad.Enabled = false;
                comboFuncionalidadesEliminar.Enabled = false;

                buttonAgregarFuncionalidad.Enabled = true;
                comboFuncionalidadesDisponibles.Enabled = true;
            }
            else if (comboFuncionalidadesDisponibles.Items.Count == 0)
            {
                buttonAgregarFuncionalidad.Enabled = false;
                comboFuncionalidadesDisponibles.Enabled = false;

                buttonEliminarFuncionalidad.Enabled = true;
                comboFuncionalidadesEliminar.Enabled = true;
            }
            else if (comboFuncionalidadesDisponibles.Items.Count != 0 && comboFuncionalidadesEliminar.Items.Count != 0)
            {
                buttonAgregarFuncionalidad.Enabled = true;
                buttonEliminarFuncionalidad.Enabled = true;

                comboFuncionalidadesDisponibles.Enabled = true;
                comboFuncionalidadesEliminar.Enabled = true;
            }
            else
            {
                
            }
        }

       
        private void buttonAgregarFuncionalidad_Click(object sender, EventArgs e)
        {
            if (labelRolId.Text.Length > 0 && comboFuncionalidadesDisponibles.Text.Length > 0)
            {
                using (SqlConnection connection = new SqlConnection(conexion))
                {
                    try
                    {
                        using (SqlCommand command = new SqlCommand())
                        {
                            connection.Open();
                            command.Connection = connection;
                            command.CommandType = System.Data.CommandType.StoredProcedure;

                            command.CommandText = "TEQUILASO.sp_agregarFuncionalidad";
                            command.Parameters.AddWithValue("@Id_rol", Convert.ToInt32(labelRolId.Text));
                            command.Parameters.AddWithValue("@Id_funcionalidad", Convert.ToInt32(comboFuncionalidadesDisponibles.SelectedValue));
                         
                            command.ExecuteReader();
                            connection.Close();
                            MessageBox.Show("Se agregó una nueva funcionalidad.");
                            cargarComboFuncionalidadesDisponibles(Convert.ToInt32(labelRolId.Text));
                            cargarComboFuncionalidadesEliminar(Convert.ToInt32(labelRolId.Text));

                            if (comboFuncionalidadesEliminar.Items.Count == 0)
                            {
                                buttonEliminarFuncionalidad.Enabled = false;
                                buttonAgregarFuncionalidad.Enabled = true;
                            }
                            else if(comboFuncionalidadesDisponibles.Items.Count == 0)
                            {
                                buttonAgregarFuncionalidad.Enabled = false;
                                buttonEliminarFuncionalidad.Enabled = true;
                            }
                            else
                            {
                                buttonEliminarFuncionalidad.Enabled = true;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error al generar el alta.");
                    }
                }
            }
            else {
                MessageBox.Show("Debe seleccionar primero un rol y una funcionalidad para poder realizar la operación.");
            }
        }

        private void buttonEliminarFuncionalidad_Click(object sender, EventArgs e)
        {
            if (labelRolId.Text.Length > 0 && comboFuncionalidadesDisponibles.Text.Length > 0)
            {
                using (SqlConnection connection = new SqlConnection(conexion))
                {
                    try
                    {
                        using (SqlCommand command = new SqlCommand())
                        {
                            connection.Open();
                            command.Connection = connection;
                            command.CommandType = System.Data.CommandType.StoredProcedure;

                            command.CommandText = "TEQUILASO.sp_eliminarFuncionalidad";
                            command.Parameters.AddWithValue("@Id_rol", Convert.ToInt32(labelRolId.Text));
                            command.Parameters.AddWithValue("@Id_funcionalidad", Convert.ToInt32(comboFuncionalidadesEliminar.SelectedValue));

                            command.ExecuteReader();
                            connection.Close();
                            MessageBox.Show("Se eliminó la funcionalidad.");
                            cargarComboFuncionalidadesDisponibles(Convert.ToInt32(labelRolId.Text));
                            cargarComboFuncionalidadesEliminar(Convert.ToInt32(labelRolId.Text));
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error al eliminar funcionalidad.");
                    }
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar primero un rol y una funcionalidad para poder realizar la operación.");
            }
        }

        public void checkRolHabilitado(bool habilitado, Int32 idRol) {
            if (habilitado)
            {
                buttonAgregarFuncionalidad.Enabled = true;
                buttonEliminarFuncionalidad.Enabled = true;
                buttonHabilitarRol.Enabled = false;
                buttonEliminarRol.Enabled = true;

                comboFuncionalidadesDisponibles.Enabled = true;
                comboFuncionalidadesEliminar.Enabled = true;
                cargarComboFuncionalidadesDisponibles(idRol);
                cargarComboFuncionalidadesEliminar(idRol);
            }
            else
            {
                buttonHabilitarRol.Enabled = true;
                buttonEliminarRol.Enabled = false;

                buttonAgregarFuncionalidad.Enabled = false;
                buttonEliminarFuncionalidad.Enabled = false;
                comboFuncionalidadesDisponibles.Enabled = false;
                comboFuncionalidadesEliminar.Enabled = false;
            }
        }

        private void buttonDeshabilitarRol_Click(object sender, EventArgs e)
        {
            using (SqlConnection connection = new SqlConnection(conexion))
            {
                try
                {
                    using (SqlCommand command = new SqlCommand())
                    {
                        connection.Open();
                        command.Connection = connection;
                        command.CommandType = System.Data.CommandType.StoredProcedure;

                        command.CommandText = "TEQUILASO.sp_deshabilitarRol";
                        command.Parameters.AddWithValue("@Id_rol", Convert.ToInt32(labelRolId.Text));
                        command.Parameters.AddWithValue("@Habilitado", 0);
                        
                        command.ExecuteReader();
                        connection.Close();
                        MessageBox.Show("Se eliminó el Rol.");
                        inicializar();
                        listadoRol();
                        dataGridRol.Refresh();
                        
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error al eliminar funcionalidad.");
                }
            }
            
        }

        private void buttonHabilitarRol_Click(object sender, EventArgs e)
        {
            using (SqlConnection connection = new SqlConnection(conexion))
            {
                try
                {
                    using (SqlCommand command = new SqlCommand())
                    {
                        connection.Open();
                        command.Connection = connection;
                        command.CommandType = System.Data.CommandType.StoredProcedure;

                        command.CommandText = "TEQUILASO.sp_habilitarRol";
                        command.Parameters.AddWithValue("@Id_rol", Convert.ToInt32(labelRolId.Text));
                        command.Parameters.AddWithValue("@Habilitado", 1);
                        
                        command.ExecuteReader();
                        connection.Close();
                        MessageBox.Show("Se Habilitó el Rol.");
                        inicializar();
                        listadoRol();
                        dataGridRol.Refresh();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error al Habilitar el Rol.");
                }
            }

        }

        private void buttonNombre_Click(object sender, EventArgs e)
        {
            if(textNombre.Text.Length != 0){
                using (SqlConnection connection = new SqlConnection(conexion))
                {
                    try
                    {
                        using (SqlCommand command = new SqlCommand())
                        {
                            connection.Open();
                            command.Connection = connection;
                            command.CommandType = System.Data.CommandType.StoredProcedure;

                            command.CommandText = "TEQUILASO.sp_cambiarNombreRol";
                            command.Parameters.AddWithValue("@Id_rol", Convert.ToInt32(labelRolId.Text));
                            command.Parameters.AddWithValue("@Nombre", textNombre.Text);

                            command.ExecuteReader();
                            connection.Close();
                            MessageBox.Show("Se Modificó el nombre del Rol.");
                            inicializar();
                            listadoRol();
                            dataGridRol.Refresh();
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error al Modificar el Nombre de Rol.");
                    }
                }  
            }
        }

        private void dataGridRol_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dataGridRol.CurrentRow.Cells[1].Value.ToString() != null && dataGridRol.CurrentRow.Cells[1].Value.ToString().Length > 0)
            {
                textNombre.Text = dataGridRol.CurrentRow.Cells[1].Value.ToString();
                idRolGlobal = Convert.ToInt32(dataGridRol.CurrentRow.Cells[0].Value.ToString());
                habilitadoGlobal = Convert.ToBoolean(dataGridRol.CurrentRow.Cells[2].Value.ToString());
                labelRolId.Text = idRolGlobal.ToString();
                checkRolHabilitado(habilitadoGlobal, idRolGlobal);
            }
        }

        private void buttonBuscar_Click(object sender, EventArgs e)
        {
            if (campoBusqueda.Text.Length != 0)
            {
                using (SqlConnection connection = new SqlConnection(conexion))
                {
                    try
                    {
                        string sentSql = @"SELECT R.ID, R.NOMBRE ROL ,R.HABILITADO from TEQUILASO.ROL R "+
                                            "WHERE R.NOMBRE like '%"+ campoBusqueda.Text + "%'" +    
                                            "GROUP BY R.NOMBRE,R.ID,R.HABILITADO";
                        SqlConnection sqlConn = new SqlConnection(conexion);
                        sqlConn.Open();

                        DataTable objDataTable = new DataTable();
                        SqlDataAdapter dataAdap = new SqlDataAdapter(sentSql, sqlConn);
                        dataAdap.Fill(objDataTable);

                        dataGridRol.DataSource = (objDataTable);
                        connection.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error en la tabla Funcionalidad");
                    }
                }
            }
            else {
                MessageBox.Show("Complete el campo para buscar.");
            }
        }

       private void buttonLimpiar_Click(object sender, EventArgs e)
        {
            campoBusqueda.Text = "";
            listadoRol();
        }

       private void checkedListFuncionalidades_SelectedIndexChanged(object sender, EventArgs e)
       {
           if (checkedListFuncionalidades.CheckedItems.Count != 0)
           {
               foreach (int indexChecked in checkedListFuncionalidades.CheckedIndices)
               {
                   string ti = checkedListFuncionalidades.GetItemText(indexChecked);
                   
                   
               }
           }
       }
    
    }
}
